package cn.lumora.core.util;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

import java.util.Set;

/**
 * Redis操作服务，提供基础的Redis读写操作
 */
@Service
@Slf4j
public class RedisService {

    private final JedisPool jedisPool;

    @Autowired
    public RedisService(JedisPool jedisPool) {
        this.jedisPool = jedisPool;
    }

    /**
     * 获取Jedis实例
     *
     * @return Jedis实例
     */
    private Jedis getJedis() {
        return jedisPool.getResource();
    }

    /**
     * 存储数据并设置过期时间
     *
     * @param key 键
     * @param value 值
     * @param seconds 过期时间（秒）
     */
    public void setEx(String key, String value, int seconds) {
        try (Jedis jedis = getJedis()) {
            // 使用setex命令原子性地设置键值和过期时间
            jedis.setex(key, seconds, value);
        }catch (Exception e){
            log.error("RedisService.setEx error: {}", e.getMessage());
            throw new RuntimeException(e);
        }
    }

    /**
     * 获取数据
     *
     * @param key 键
     * @return 值，如果不存在则返回null
     */
    public String get(String key) {
        try (Jedis jedis = getJedis()) {
            // 获取指定键的值
            return jedis.get(key);
        }
    }

    /**
     * 删除数据
     *
     * @param key 键
     */
    public void delete(String key) {
        try (Jedis jedis = getJedis()) {
            if (jedis.exists(key)) {
                jedis.del(key);
            }
        }
    }

    /**
     * 自增操作
     *
     * @param key 键
     * @param delta 自增值
     * @return 自增后的值
     */
    public Long increment(String key, long delta) {
        try (Jedis jedis = getJedis()) {
            // 原子性地增加指定键的值
            return jedis.incrBy(key, delta);
        }catch (Exception e){
            log.error("RedisService.increment error: {}", e.getMessage());
            throw new RuntimeException(e);
        }
    }

    /**
     * 获取匹配模式的键集合
     *
     * @param pattern 匹配模式
     * @return 符合条件的键集合
     */
    public Set<String> keys(String pattern) {
        try (Jedis jedis = getJedis()) {
            // 获取所有匹配模式的键
            return jedis.keys(pattern);
        }
    }
}
